refactored column header navigation/resizing/reordering to be more
authorMichael Natterer <mitch@imendio.com>
Fri, 15 Sep 2006 12:51:58 +0000 (12:51 +0000)
committerMichael Natterer <mitch@src.gnome.org>
Fri, 15 Sep 2006 12:51:58 +0000 (12:51 +0000)
2006-09-15  Michael Natterer  <mitch@imendio.com>

* gtk/gtktreeview.c (gtk_tree_view_key_press): refactored column
header navigation/resizing/reordering to be more readable and lose
one level of nesting.

ChangeLog
gtk/gtktreeview.c

index 5dd4119e09730e53a607e724102d05802fe323a8..4ee72d9a7435c3165032faadbc26fad3b620f712 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-09-15  Michael Natterer  <mitch@imendio.com>
+
+       * gtk/gtktreeview.c (gtk_tree_view_key_press): refactored column
+       header navigation/resizing/reordering to be more readable and lose
+       one level of nesting.
+
 2006-09-15  Kristian Rietveld  <kris@imendio.com>
 
        * gtk/gtktreeview.c (gtk_tree_view_key_press): actually directly
index 378bd63629868da2704fd0ccb35fbb4f5d910661..4dda8eaceacffec56eb40213f78e0483de85b6ea 100644 (file)
@@ -5075,10 +5075,6 @@ gtk_tree_view_key_press (GtkWidget   *widget,
                         GdkEventKey *event)
 {
   GtkTreeView *tree_view = (GtkTreeView *) widget;
-  GList *list;
-  gboolean rtl;
-
-  rtl = (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL);
 
   if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_DRAG))
     {
@@ -5090,179 +5086,177 @@ gtk_tree_view_key_press (GtkWidget   *widget,
       return TRUE;
     }
 
-  if (tree_view->priv->columns && 
-      (event->state & GDK_SHIFT_MASK) && (event->state & GDK_MOD1_MASK) &&
-      (event->keyval == GDK_Left || event->keyval == GDK_KP_Left
-       || event->keyval == GDK_Right || event->keyval == GDK_KP_Right))
+  if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE))
     {
-      list = tree_view->priv->columns;
-      while (list)
+      GList *focus_column;
+      gint focus_column_width = 0;
+      gboolean rtl;
+
+      rtl = (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL);
+
+      for (focus_column = tree_view->priv->columns;
+           focus_column;
+           focus_column = focus_column->next)
         {
-         GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN (list->data);
-         if (GTK_WIDGET_HAS_FOCUS (column->button))
-           {
-             if (!column->resizable)
-               return TRUE;
+          GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN (focus_column->data);
 
-             if (event->keyval == (rtl ? GDK_Right : GDK_Left)
-                  || event->keyval == (rtl ? GDK_KP_Right : GDK_KP_Left))
-               {
-                 column->resized_width = MAX (column->resized_width,
-                                              column->width);
-                 column->resized_width -= 2;
-                 if (column->resized_width < 0)
-                   column->resized_width = 0;
-
-                 if (column->min_width == -1)
-                   column->resized_width = MAX (column->button->requisition.width, column->resized_width);
-                 else
-                   column->resized_width = MAX (column->min_width, column->resized_width);
+          if (GTK_WIDGET_HAS_FOCUS (column->button))
+            break;
 
-                 if (column->max_width != -1)
-                   column->resized_width = MIN (column->resized_width, column->max_width);
+          if (column->visible)
+            focus_column_width += GTK_TREE_VIEW_COLUMN (column)->width;
+        }
 
-                 column->use_resized_width = TRUE;
-                 gtk_widget_queue_resize (widget);
-                 return TRUE;
-               }
-             else if (event->keyval == (rtl ? GDK_Left : GDK_Right)
-                       || event->keyval == (rtl ? GDK_KP_Left : GDK_KP_Right))
-               {
-                 column->resized_width = MAX (column->resized_width,
-                                              column->width);
-                 column->resized_width += 2;
+      if (focus_column &&
+          (event->state & GDK_SHIFT_MASK) && (event->state & GDK_MOD1_MASK) &&
+          (event->keyval == GDK_Left || event->keyval == GDK_KP_Left
+           || event->keyval == GDK_Right || event->keyval == GDK_KP_Right))
+        {
+          GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN (focus_column->data);
 
-                 if (column->max_width != -1)
-                   column->resized_width = MIN (column->resized_width, column->max_width);
+          if (!column->resizable)
+            return TRUE;
 
-                 column->use_resized_width = TRUE;
-                 gtk_widget_queue_resize (widget);
-                 return TRUE;
-               }
+          if (event->keyval == (rtl ? GDK_Right : GDK_Left)
+              || event->keyval == (rtl ? GDK_KP_Right : GDK_KP_Left))
+            {
+              column->resized_width = MAX (column->resized_width,
+                                           column->width);
+              column->resized_width -= 2;
+              if (column->resized_width < 0)
+                column->resized_width = 0;
+
+              if (column->min_width == -1)
+                column->resized_width = MAX (column->button->requisition.width,
+                                             column->resized_width);
+              else
+                column->resized_width = MAX (column->min_width,
+                                             column->resized_width);
 
-             break;
-           }
-         list = list->next;
-       }
-    }
+              if (column->max_width != -1)
+                column->resized_width = MIN (column->resized_width,
+                                             column->max_width);
 
-  if (tree_view->priv->columns && (event->state & GDK_MOD1_MASK) &&
-      (event->keyval == GDK_Left || event->keyval == GDK_KP_Left
-       || event->keyval == GDK_Right || event->keyval == GDK_KP_Right
-       || event->keyval == GDK_Home || event->keyval == GDK_KP_Home
-       || event->keyval == GDK_End || event->keyval == GDK_KP_End))
-    {
-      list = tree_view->priv->columns;
-      while (list)
-        {
-         GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN (list->data);
-         if (GTK_WIDGET_HAS_FOCUS (column->button))
-           {
-             if (event->keyval == (rtl ? GDK_Right : GDK_Left)
-                  || event->keyval == (rtl ? GDK_KP_Right : GDK_KP_Left))
-               {
-                 GtkTreeViewColumn *col;
-                 col = gtk_tree_view_get_drop_column (tree_view, column, DROP_LEFT);
-                 if (col != (GtkTreeViewColumn *)0x1)
-                   gtk_tree_view_move_column_after (tree_view, column, col);
-                 return TRUE;
-               }
-             else if (event->keyval == (rtl ? GDK_Left : GDK_Right)
-                       || event->keyval == (rtl ? GDK_KP_Left : GDK_KP_Right))
-               {
-                 GtkTreeViewColumn *col;
-                 col = gtk_tree_view_get_drop_column (tree_view, column, DROP_RIGHT);
-                 if (col != (GtkTreeViewColumn *)0x1)
-                   gtk_tree_view_move_column_after (tree_view, column, col);
-                 return TRUE;
-               }
-             else if (event->keyval == GDK_Home
-                       || event->keyval == GDK_KP_Home)
-               {
-                 GtkTreeViewColumn *col;
-                 col = gtk_tree_view_get_drop_column (tree_view, column, DROP_HOME);
-                 if (col != (GtkTreeViewColumn *)0x1)
-                   gtk_tree_view_move_column_after (tree_view, column, col);
-                 return TRUE;
-               }
-             else if (event->keyval == GDK_End || event->keyval == GDK_KP_End)
-               {
-                 GtkTreeViewColumn *col;
-                 col = gtk_tree_view_get_drop_column (tree_view, column, DROP_END);
-                 if (col != (GtkTreeViewColumn *)0x1)
-                   gtk_tree_view_move_column_after (tree_view, column, col);
-                 return TRUE;
-               }
+              column->use_resized_width = TRUE;
+              gtk_widget_queue_resize (widget);
+            }
+          else if (event->keyval == (rtl ? GDK_Left : GDK_Right)
+                   || event->keyval == (rtl ? GDK_KP_Left : GDK_KP_Right))
+            {
+              column->resized_width = MAX (column->resized_width,
+                                           column->width);
+              column->resized_width += 2;
 
-             break;
-           }
-         list = list->next;
-       }
-    }
+              if (column->max_width != -1)
+                column->resized_width = MIN (column->resized_width,
+                                             column->max_width);
 
-  if (tree_view->priv->columns &&
-      GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE) &&
-      (event->keyval == GDK_Left || event->keyval == GDK_KP_Left
-       || event->keyval == GDK_Right || event->keyval == GDK_KP_Right))
-    {
-      gint width = 0;
-      list = tree_view->priv->columns;
-      while (list)
-       {
-         GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN (list->data);
-         if (GTK_WIDGET_HAS_FOCUS (column->button))
-           {
-             if ((event->keyval == (rtl ? GDK_Right : GDK_Left)
-                   || event->keyval == (rtl ? GDK_KP_Right : GDK_KP_Left))
-                  && list->prev)
-               {
-                 GList *tmp;
+              column->use_resized_width = TRUE;
+              gtk_widget_queue_resize (widget);
+            }
 
-                 for (tmp = list->prev; tmp; tmp = tmp->prev)
-                   if (GTK_TREE_VIEW_COLUMN (tmp->data)->visible)
-                     break;
+          return TRUE;
+        }
 
-                 if (!tmp)
-                   return FALSE;
+      if (focus_column &&
+          (event->state & GDK_MOD1_MASK) &&
+          (event->keyval == GDK_Left || event->keyval == GDK_KP_Left
+           || event->keyval == GDK_Right || event->keyval == GDK_KP_Right
+           || event->keyval == GDK_Home || event->keyval == GDK_KP_Home
+           || event->keyval == GDK_End || event->keyval == GDK_KP_End))
+        {
+          GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN (focus_column->data);
 
-                 tree_view->priv->focus_column = GTK_TREE_VIEW_COLUMN (tmp->data);
-                 gtk_widget_grab_focus (tree_view->priv->focus_column->button);
-                 width -= tree_view->priv->focus_column->width;
-                 gtk_adjustment_set_value (tree_view->priv->hadjustment, CLAMP (width, tree_view->priv->hadjustment->lower, tree_view->priv->hadjustment->upper - tree_view->priv->hadjustment->page_size));
-                 return TRUE;
-               }
-             else if ((event->keyval == (rtl ? GDK_Left : GDK_Right)
-                        || event->keyval == (rtl ? GDK_KP_Left : GDK_KP_Right))
-                       && list->next)
-               {
-                 GList *tmp;
+          if (event->keyval == (rtl ? GDK_Right : GDK_Left)
+              || event->keyval == (rtl ? GDK_KP_Right : GDK_KP_Left))
+            {
+              GtkTreeViewColumn *col;
+              col = gtk_tree_view_get_drop_column (tree_view, column, DROP_LEFT);
+              if (col != (GtkTreeViewColumn *)0x1)
+                gtk_tree_view_move_column_after (tree_view, column, col);
+            }
+          else if (event->keyval == (rtl ? GDK_Left : GDK_Right)
+                   || event->keyval == (rtl ? GDK_KP_Left : GDK_KP_Right))
+            {
+              GtkTreeViewColumn *col;
+              col = gtk_tree_view_get_drop_column (tree_view, column, DROP_RIGHT);
+              if (col != (GtkTreeViewColumn *)0x1)
+                gtk_tree_view_move_column_after (tree_view, column, col);
+            }
+          else if (event->keyval == GDK_Home || event->keyval == GDK_KP_Home)
+            {
+              GtkTreeViewColumn *col;
+              col = gtk_tree_view_get_drop_column (tree_view, column, DROP_HOME);
+              if (col != (GtkTreeViewColumn *)0x1)
+                gtk_tree_view_move_column_after (tree_view, column, col);
+            }
+          else if (event->keyval == GDK_End || event->keyval == GDK_KP_End)
+            {
+              GtkTreeViewColumn *col;
+              col = gtk_tree_view_get_drop_column (tree_view, column, DROP_END);
+              if (col != (GtkTreeViewColumn *)0x1)
+                gtk_tree_view_move_column_after (tree_view, column, col);
+            }
 
-                 for (tmp = list->next; tmp; tmp = tmp->next)
-                   if (GTK_TREE_VIEW_COLUMN (tmp->data)->visible)
-                     break;
+          return TRUE;
+        }
+
+      if (focus_column &&
+          (event->keyval == GDK_Left || event->keyval == GDK_KP_Left
+           || event->keyval == GDK_Right || event->keyval == GDK_KP_Right))
+        {
+          if ((event->keyval == (rtl ? GDK_Right : GDK_Left)
+               || event->keyval == (rtl ? GDK_KP_Right : GDK_KP_Left))
+              && focus_column->prev)
+            {
+              GList *tmp;
+
+              for (tmp = focus_column->prev; tmp; tmp = tmp->prev)
+                if (GTK_TREE_VIEW_COLUMN (tmp->data)->visible)
+                  break;
+
+              if (!tmp)
+                return FALSE;
+
+              tree_view->priv->focus_column = GTK_TREE_VIEW_COLUMN (tmp->data);
+              gtk_widget_grab_focus (tree_view->priv->focus_column->button);
+              focus_column_width -= tree_view->priv->focus_column->width;
+              gtk_adjustment_set_value (tree_view->priv->hadjustment,
+                                        CLAMP (focus_column_width,
+                                               tree_view->priv->hadjustment->lower,
+                                               tree_view->priv->hadjustment->upper - tree_view->priv->hadjustment->page_size));
+            }
+          else if ((event->keyval == (rtl ? GDK_Left : GDK_Right)
+                    || event->keyval == (rtl ? GDK_KP_Left : GDK_KP_Right))
+                   && focus_column->next)
+            {
+              GList *tmp;
 
-                 if (!tmp)
-                   return FALSE;
+              for (tmp = focus_column->next; tmp; tmp = tmp->next)
+                if (GTK_TREE_VIEW_COLUMN (tmp->data)->visible)
+                  break;
 
-                 tree_view->priv->focus_column = GTK_TREE_VIEW_COLUMN (tmp->data);
+              if (!tmp)
+                return FALSE;
 
-                 gtk_widget_grab_focus (tree_view->priv->focus_column->button);
-                 width += tree_view->priv->focus_column->width;
-                 gtk_adjustment_set_value (tree_view->priv->hadjustment, CLAMP (width, tree_view->priv->hadjustment->lower, tree_view->priv->hadjustment->upper - tree_view->priv->hadjustment->page_size));
-                 return TRUE;
-               }
+              tree_view->priv->focus_column = GTK_TREE_VIEW_COLUMN (tmp->data);
 
-             return TRUE;
-           }
-         width += GTK_TREE_VIEW_COLUMN (list->data)->width;
-         list = list->next;
-       }
+              gtk_widget_grab_focus (tree_view->priv->focus_column->button);
+              focus_column_width += tree_view->priv->focus_column->width;
+              gtk_adjustment_set_value (tree_view->priv->hadjustment,
+                                        CLAMP (focus_column_width,
+                                               tree_view->priv->hadjustment->lower,
+                                               tree_view->priv->hadjustment->upper - tree_view->priv->hadjustment->page_size));
+            }
+
+          return TRUE;
+        }
     }
 
   /* Chain up to the parent class.  It handles the keybindings. */
-  if ((* GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->key_press_event) (widget, event))
+  if (GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->key_press_event (widget, event))
     return TRUE;
-                                                           
+
   /* We pass the event to the search_entry.  If its text changes, then we start
    * the typeahead find capabilities. */
   if (tree_view->priv->enable_search